package gruppenkalenderProjekt.db;

import gruppenkalenderProjekt.data.Kategorie;
import gruppenkalenderProjekt.data.KategorieImpl;
import java.awt.Color;
import java.rmi.RemoteException;
import java.sql.*;
import java.util.Vector;
// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.635CE19D-BA81-36B4-558D-223B250053BC]
// </editor-fold>

/** Agiert als Schnittstelle zur Kategorie Tabelle der Datenbank.
 * Beinhaltet die SQL Statements zur Auslesung und Datenmanipulation.
 *
 * @author  Rathke,Thies
 * @coauthor Gruppe 2
 */
public class KategorieMapper {

    private static KategorieMapper kategorieMapper = null;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E7BF7910-05C3-EDBB-6D5B-D8E1165FEFB4]
    // </editor-fold> 
    

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.BC70838B-5273-4FA8-FD2F-95181DBA7D19]
    // </editor-fold> 
    protected KategorieMapper() {
    }

    /**
     * Diese statische Methode kann aufgrufen werden durch
     * <code>KategorieMapper.kategorieMapper()</code>. Sie stellt die
     * Singleton-Eigenschaft sicher, indem Sie dafür sorgt, daß nur eine einzige
     * Instanz von <code>KategorieMapper</code> existiert.<p>
     *
     * <b>Fazit:</b> KategorieMapper sollte nicht mittels <code>new</code>
     * instantiiert werden, sondern stets durch Aufruf dieser statischen Methode.
     *
     * @return DAS <code>KategorietMapper</code>-Objekt.
     * @see kategorieMapper
     */
    public static KategorieMapper kategorieMapper() {
        // Wenn noch kein Kategorie-Mapper existiert wird dieser jetzt erstellt
        if (kategorieMapper == null) {
            kategorieMapper = new KategorieMapper();
        }
        System.out.print("kategorieMapper erstellt...");
        return kategorieMapper;
    }
/**Methode die alle Kategorien findet und zurück gibt
 *
 * @return result ein Vector mit Kategorie OBjekten
 */
    public Vector<Kategorie> findeAlleKategorien() {
        //Ein Connection Objekt wird erstellt und Datenbankverbindung wird mitgegeben
        Connection con = DBConnection.connection();
        //Ein Vektor vom Typ Kategorie wird erstellt
        Vector<Kategorie> result = new Vector<Kategorie>();

        try {
            //leeres Statement erstellen
            Statement stmt = con.createStatement();
            //Neues ResultSet erstellen und Datenbankinhalt in dieser ablegen
            ResultSet rs = stmt.executeQuery(
                    "SELECT * FROM kategorie ");
            // Solange weitere Datensätze im Result Set vorhanden
            while (rs.next()) {
                try {
                    //Lokales Objekt zum Zwischenspeichern erstellen
                    Kategorie k = new KategorieImpl();
                    k.setKategorieID(rs.getInt("kat_ID"));
                    k.setBezeichnung(rs.getString("bezeichnung"));
                    //Neues Color Objekt anlegen. Ziel is es hierbei ein Color-Objekt aus einem String zu erstellen                   
                    Color c = new Color(rs.getInt("farbe"));
                    k.setFarbe(c);
                    //Objekte dem Vektor hinzufügen
                    result.addElement(k);

                } catch (RemoteException ex) {
                    ex.printStackTrace();
                }
            }
        } catch (SQLException e2) {
            e2.printStackTrace();
        }

        return result;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E9AE3CB8-1697-41AD-6770-7E2FE400AE97]
    // </editor-fold>
    /**Methode die eine Kategorie mit einer ID findet
     *
     * @param kat_ID die ID des zu findenden Kalenders
     * @return k ein Kategorie Objekt
     */
    public Kategorie findeKategorieMitID(int kat_ID) {

        Connection con = DBConnection.connection();                 //DB verbindung
        try {
            Statement stmt = con.createStatement();                  //leeres Statement anlegen --> jdbc!
            ResultSet rs = stmt.executeQuery( // statement füllen und ausführen an DB
                    "SELECT * FROM kategorie " +
                    "WHERE kat_ID=" + kat_ID);

            if (rs.next()) {
                try {
                    Kategorie k = new KategorieImpl();
                    k.setKategorieID(rs.getInt("kat_ID"));
                    k.setBezeichnung(rs.getString("bezeichnung"));
                    Color c = new Color(rs.getInt("farbe"));
                    k.setFarbe(c);
                    return k;

                } catch (RemoteException ex) {
                    ex.printStackTrace();
                    return null;
                }
            }
        } catch (SQLException e2) {
            e2.printStackTrace();
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.D2143DD6-8264-BF4E-096C-313072C9699C]
    // </editor-fold>
    /**Legt eine neue Kategorie an
     *
     * @param kategorie die anzulegende Kategorie
     * @return k ein Kategorie Objekt
     */
    public Kategorie insert(Kategorie kategorie) {
        Connection con = DBConnection.connection();         //connection holen

        try {
            Statement stmt = con.createStatement();             //neues statement anlegen


            stmt.executeUpdate("INSERT INTO kategorie (bezeichnung, farbe) " + //einfügen des neuen objekts in db
                    "VALUES ('" +
                    kategorie.getBezeichnung() + "','" +
                    kategorie.getFarbe().getRGB() + "')");

            try {
                stmt = con.createStatement();

                ResultSet rs = stmt.executeQuery("SELECT kat_ID FROM kategorie WHERE kategorie.bezeichnung = '" + kategorie.getBezeichnung()
                        + "' AND kategorie.farbe = '" + kategorie.getFarbe().getRGB() + "'");

                if(rs.next()){
                    kategorie.setKategorieID(rs.getInt("kat_ID"));
                }

            } catch (SQLException e3) {
                e3.printStackTrace();
            }
        } catch (RemoteException ex) {
            ex.printStackTrace();
        } catch (SQLException e2) {
            e2.printStackTrace();
        }
        return kategorie; //eingefügtes Objekt wird wieder zurückgegeben
    }

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.FBFAD20D-4219-EAEC-DF72-4719E3B6AEC0]
// </editor-fold>
    /**Methode die eine Kategorie loescht
     *
     * @param kategorie die zu loeschende Kategorie
     */
    public void delete(Kategorie kategorie) {
        Connection con = DBConnection.connection();
        int e_ID = 0;

        try {
            Statement stmt = con.createStatement();

            stmt.executeUpdate("DELETE FROM kategorie " +
                    "WHERE kat_ID=" + kategorie.getKategorieID());

            stmt.executeUpdate("DELETE FROM kalendereintrag " +
                    "WHERE kat_ID=" + kategorie.getKategorieID());
            

        } catch (SQLException e2) {
            e2.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.AABECBEC-A48B-5D88-CBFA-9F475F560ABE]
    // </editor-fold> 

    /**Methode die eine Kategorie aktualisiert
     *
     * @param kategorie die zu aktualisierende Kategorie
     * @return k ein Kategorie Objekt
     */
    public Kategorie update(Kategorie kategorie) {
        Connection con = DBConnection.connection();
        try {
            Statement stmt = con.createStatement();

            stmt.executeUpdate("UPDATE kategorie " +
                    "SET " +
                    "bezeichnung='" + kategorie.getBezeichnung() +
                    "',farbe='" + kategorie.getFarbe().getRGB() +
                    "' WHERE kat_ID=" + kategorie.getKategorieID());

        } catch (SQLException e2) {
            e2.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        return kategorie; //geändertes Objekt wird wieder zurückgegeben
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.E9AE3CB8-1697-41AD-6770-7E2FE400AE97]
    // </editor-fold>
    /**Methode die die Kategorie eines Kalendereintrags findet und zurueck gibt
     *
     * @param e_ID die ID des Kalendereintrags
     * @return k Kategorie des Kalendereintrags
     */
    public Kategorie findeKategorieVonKalendereintrag(int e_ID) {

        Connection con = DBConnection.connection();                 //DB verbindung
        try {
            Statement stmt = con.createStatement();                  //leeres Statement anlegen --> jdbc!
            ResultSet rs = stmt.executeQuery( // statement füllen und ausführen an DB
                    "SELECT kat_ID FROM kalendereintrag " +
                    "WHERE e_ID=" + e_ID);

            if (rs.next()) {
                return this.findeKategorieMitID(rs.getInt("kat_ID"));
            }
        } catch (SQLException e2) {
            e2.printStackTrace();
        }
        return null;
    }
}

